﻿Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D
Public Class AnimationLaserstrahl
    Inherits ObjektAnimation
    Const HalteFrame As Integer = 2
    Const FrameMax As Integer = 18
    Dim Zaehler As Integer = 0
    Dim Laser As GebaeudeLaser = Nothing
    Public Sub New(ByVal X, ByVal Y, ByVal Musikspielen)
        MyBase.New(Musikspielen, ObjektSpielfeld.Bodenschlacht)
        Laser = Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebaeude
        P.X = X
        P.Y = Y
        If DataSettings.MusikSound Then
            '    MusikEngine.LoadWav(DataSettings.Resourcenpfad + "Sound\Sound Effects\Overworld\Explosion+Bombe.wav", False)
        End If

    End Sub

    Public Overrides Function Malen(ByVal intColor As System.Drawing.Color, Optional ByVal Zoomfaktor As Single = 1.0, Optional ByVal Feldbreite As Integer = -1) As Boolean
        If DataSettings.draw3D Then

        ElseIf DataSettings._2D_3D_Malen Then
            Select Case DataSettings.TerrainStyle
                Case TerrainStyle.CommanderWars2
                    Grafikengine.ptfRotCenter = New Point(CInt(71 / 2), CInt(63 / 2))
                    With Grafikengine.recBild
                        .X = 71 * Frame : .Width = 71
                        .Y = 0 : .Height = 63
                    End With
                Case Else
                    Grafikengine.ptfRotCenter = New Point(CInt(47 / 2), CInt(42 / 2))
                    With Grafikengine.recBild
                        .X = 47 * Frame : .Width = 47
                        .Y = 0 : .Height = 42
                    End With
            End Select


            Dim EinzelSize As Single = 1 / (FrameMax + 1)
            Dim cube(3) As CustomVertex.PositionTextured
            cube(0) = New CustomVertex.PositionTextured(0, 0, 0, EinzelSize * Frame, 1)
            cube(1) = New CustomVertex.PositionTextured(0, 0, Grafikengine.recBild.Height / Hauptmenue.Feldbreite, EinzelSize * Frame, 0)
            cube(2) = New CustomVertex.PositionTextured(Grafikengine.recBild.Width / Hauptmenue.Feldbreite, 0, 0, EinzelSize * Frame + EinzelSize, 1)
            cube(3) = New CustomVertex.PositionTextured(Grafikengine.recBild.Width / Hauptmenue.Feldbreite, 0, Grafikengine.recBild.Height / Hauptmenue.Feldbreite, EinzelSize * Frame + EinzelSize, 0)

            Dim XPlus As Single = -Grafikengine.ptfRotCenter.X / Hauptmenue.Feldbreite
            Dim YPlus As Single = -(Grafikengine.recBild.Height - Grafikengine.ptfRotCenter.Y) / Hauptmenue.Feldbreite + 1 / Hauptmenue.Feldbreite

            Dim Vec As Vector3 = ObjektSpielfeld.CalcDraw2D3DVec(P.X + 0.5 + XPlus, ObjektSpielfeld.SpielfeldLayer.Animationen, P.Y - 0.5 - YPlus)
            Grafikengine.malen2Din3D(Vec, cube, TexturenHalter.GetLaserMitte, intColor)

            If Frame > FrameMax / 2 Then

                EinzelSize = 1 / (FrameMax / 2)

                'Nach Links markieren
                For I As Integer = 1 To Laser.Reichweite + 1
                    Dim X As Integer = Laser.Rechteck.X - I
                    Dim Y As Integer = Laser.Rechteck.Y

                    If Objektverwalter.Spielfeld.OnMap(X, Y) Then
                        If I = 1 Then
                            cube(0) = New CustomVertex.PositionTextured(0, 0, 0, EinzelSize * (Frame - 10), 1)
                            cube(1) = New CustomVertex.PositionTextured(0, 0, 2, EinzelSize * (Frame - 10), 0)
                            cube(2) = New CustomVertex.PositionTextured(0.5, 0, 0, EinzelSize * (Frame - 10) + EinzelSize, 1)
                            cube(3) = New CustomVertex.PositionTextured(0.5, 0, 2, EinzelSize * (Frame - 10) + EinzelSize, 0)
                            Vec = ObjektSpielfeld.CalcDraw2D3DVec(X - 0.5, ObjektSpielfeld.SpielfeldLayer.Animationen, (Y + 0.5))
                        Else
                            cube(0) = New CustomVertex.PositionTextured(0, 0, 0, EinzelSize * (Frame - 10), 1)
                            cube(1) = New CustomVertex.PositionTextured(0, 0, 2, EinzelSize * (Frame - 10), 0)
                            cube(2) = New CustomVertex.PositionTextured(1, 0, 0, EinzelSize * (Frame - 10) + EinzelSize, 1)
                            cube(3) = New CustomVertex.PositionTextured(1, 0, 2, EinzelSize * (Frame - 10) + EinzelSize, 0)
                            Vec = ObjektSpielfeld.CalcDraw2D3DVec(X, ObjektSpielfeld.SpielfeldLayer.Animationen, (Y + 0.5))
                        End If
                        Grafikengine.malen2Din3D(Vec, cube, TexturenHalter.GetLaserStrahl, intColor)
                    End If
                Next
                'Nach Rechts markieren
                For I2 As Integer = 1 To Laser.Reichweite + 1
                    Dim X As Integer = Laser.Rechteck.X + I2
                    Dim Y As Integer = Laser.Rechteck.Y
                    If Objektverwalter.Spielfeld.OnMap(X, Y) Then
                        If I2 = 1 Then
                            cube(0) = New CustomVertex.PositionTextured(0, 0, 0, EinzelSize * (Frame - 10), 1)
                            cube(1) = New CustomVertex.PositionTextured(0, 0, 2, EinzelSize * (Frame - 10), 0)
                            cube(2) = New CustomVertex.PositionTextured(0.5, 0, 0, EinzelSize * (Frame - 10) + EinzelSize, 1)
                            cube(3) = New CustomVertex.PositionTextured(0.5, 0, 2, EinzelSize * (Frame - 10) + EinzelSize, 0)
                            Vec = ObjektSpielfeld.CalcDraw2D3DVec(X + 0.5, ObjektSpielfeld.SpielfeldLayer.Animationen, (Y + 0.5))
                        Else
                            cube(0) = New CustomVertex.PositionTextured(0, 0, 0, EinzelSize * (Frame - 10), 1)
                            cube(1) = New CustomVertex.PositionTextured(0, 0, 2, EinzelSize * (Frame - 10), 0)
                            cube(2) = New CustomVertex.PositionTextured(1, 0, 0, EinzelSize * (Frame - 10) + EinzelSize, 1)
                            cube(3) = New CustomVertex.PositionTextured(1, 0, 2, EinzelSize * (Frame - 10) + EinzelSize, 0)
                            Vec = ObjektSpielfeld.CalcDraw2D3DVec(X, ObjektSpielfeld.SpielfeldLayer.Animationen, (Y + 0.5))
                        End If
                        Grafikengine.malen2Din3D(Vec, cube, TexturenHalter.GetLaserStrahl, intColor)
                    End If
                Next
                'Nach oben markieren
                For I3 As Integer = 1 To Laser.Reichweite + 1
                    Dim X As Integer = Laser.Rechteck.X
                    Dim Y As Integer = Laser.Rechteck.Y - I3
                    If Objektverwalter.Spielfeld.OnMap(X, Y) Then
                        If I3 = 1 Then
                            cube(0) = New CustomVertex.PositionTextured(0, 0, 0, EinzelSize * (Frame - 10), 0)
                            cube(1) = New CustomVertex.PositionTextured(0, 0, 0.5, EinzelSize * (Frame - 10) + EinzelSize, 0)
                            cube(2) = New CustomVertex.PositionTextured(2, 0, 0, EinzelSize * (Frame - 10), 1)
                            cube(3) = New CustomVertex.PositionTextured(2, 0, 0.5, EinzelSize * (Frame - 10) + EinzelSize, 1)
                            Vec = ObjektSpielfeld.CalcDraw2D3DVec(X - 0.5 - 1 / Hauptmenue.Feldbreite, ObjektSpielfeld.SpielfeldLayer.Animationen, (Y - 0.5))
                        Else
                            cube(0) = New CustomVertex.PositionTextured(0, 0, 0, EinzelSize * (Frame - 10), 0)
                            cube(1) = New CustomVertex.PositionTextured(0, 0, 1, EinzelSize * (Frame - 10) + EinzelSize, 0)
                            cube(2) = New CustomVertex.PositionTextured(2, 0, 0, EinzelSize * (Frame - 10), 1)
                            cube(3) = New CustomVertex.PositionTextured(2, 0, 1, EinzelSize * (Frame - 10) + EinzelSize, 1)
                            Vec = ObjektSpielfeld.CalcDraw2D3DVec(X - 0.5 - 1 / Hauptmenue.Feldbreite, ObjektSpielfeld.SpielfeldLayer.Animationen, Y)
                        End If
                        Grafikengine.malen2Din3D(Vec, cube, TexturenHalter.GetLaserStrahl, intColor)
                    End If
                Next
                'Nach unten markiern
                For I4 As Integer = 1 To Laser.Reichweite + 1
                    Dim X As Integer = Laser.Rechteck.X
                    Dim Y As Integer = Laser.Rechteck.Y + I4
                    If Objektverwalter.Spielfeld.OnMap(X, Y) Then
                        cube(0) = New CustomVertex.PositionTextured(0, 0, 0, EinzelSize * (Frame - 10), 0)
                        cube(1) = New CustomVertex.PositionTextured(0, 0, 1, EinzelSize * (Frame - 10) + EinzelSize, 0)
                        cube(2) = New CustomVertex.PositionTextured(2, 0, 0, EinzelSize * (Frame - 10), 1)
                        cube(3) = New CustomVertex.PositionTextured(2, 0, 1, EinzelSize * (Frame - 10) + EinzelSize, 1)
                        Vec = ObjektSpielfeld.CalcDraw2D3DVec(X - 0.5 - 1 / Hauptmenue.Feldbreite, ObjektSpielfeld.SpielfeldLayer.Animationen, Y)
                        Grafikengine.malen2Din3D(Vec, cube, TexturenHalter.GetLaserStrahl, intColor)
                    End If
                Next

            End If


        Else
            Dim sngRotation As Double = 0
            Grafikengine.szfScale = Nothing
            Select Case DataSettings.TerrainStyle
                Case TerrainStyle.CommanderWars2
                    Grafikengine.ptfRotCenter = New Point(CInt(71 / 2), CInt(63 / 2))
                    With Grafikengine.recBild
                        .X = 71 * Frame : .Width = 71
                        .Y = 0 : .Height = 63
                    End With
                Case Else
                    Grafikengine.ptfRotCenter = New Point(CInt(47 / 2), CInt(42 / 2))
                    With Grafikengine.recBild
                        .X = 47 * Frame : .Width = 47
                        .Y = 0 : .Height = 42
                    End With
            End Select

            Grafikengine.ptfPosition = New Drawing.Point(Hauptmenue.Feldbreite * P.X + Objektverwalter.Spielfeld.BildschirmKooX - 1, Hauptmenue.Feldbreite * P.Y + Objektverwalter.Spielfeld.BildschirmKooY - 2)

            Grafikengine.Sprite.Draw2D(TexturenHalter.GetLaserMitte, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)



            If Frame > FrameMax / 2 Then
                Grafikengine.ptfRotCenter = New Point(Hauptmenue.Feldbreite / 2, Hauptmenue.Feldbreite)

                With Grafikengine.recBild
                    .X = Hauptmenue.Feldbreite * (Frame - 10) : .Width = Hauptmenue.Feldbreite
                    .Y = 0 : .Height = Hauptmenue.Feldbreite * 2
                End With

                For I As Integer = 1 To Laser.Reichweite + 1
                    Dim X As Integer = Laser.Rechteck.X - I
                    Dim Y As Integer = Laser.Rechteck.Y

                    If Objektverwalter.Spielfeld.OnMap(X, Y) Then
                        If I = 1 Then
                            Grafikengine.szfScale = New Size(Hauptmenue.Feldbreite / 2, Hauptmenue.Feldbreite * 2)
                            Grafikengine.ptfPosition = New Drawing.Point(Hauptmenue.Feldbreite * X + Objektverwalter.Spielfeld.BildschirmKooX - Hauptmenue.Feldbreite / 2, Hauptmenue.Feldbreite * Y + Objektverwalter.Spielfeld.BildschirmKooY - 1)
                        Else
                            Grafikengine.szfScale = Nothing
                            Grafikengine.ptfPosition = New Drawing.Point(Hauptmenue.Feldbreite * X + Objektverwalter.Spielfeld.BildschirmKooX, Hauptmenue.Feldbreite * Y + Objektverwalter.Spielfeld.BildschirmKooY - 1)
                        End If

                        Grafikengine.Sprite.Draw2D(TexturenHalter.GetLaserStrahl, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                    End If
                Next
                'Nach links markieren
                For I2 As Integer = 1 To Laser.Reichweite + 1
                    Dim X As Integer = Laser.Rechteck.X + I2
                    Dim Y As Integer = Laser.Rechteck.Y
                    If Objektverwalter.Spielfeld.OnMap(X, Y) Then
                        If I2 = 1 Then
                            Grafikengine.szfScale = New Size(Hauptmenue.Feldbreite / 2, Hauptmenue.Feldbreite * 2)
                            Grafikengine.ptfPosition = New Drawing.Point(Hauptmenue.Feldbreite * X + Objektverwalter.Spielfeld.BildschirmKooX + Hauptmenue.Feldbreite / 2, Hauptmenue.Feldbreite * Y + Objektverwalter.Spielfeld.BildschirmKooY - 1)
                        Else
                            Grafikengine.szfScale = Nothing
                            Grafikengine.ptfPosition = New Drawing.Point(Hauptmenue.Feldbreite * X + Objektverwalter.Spielfeld.BildschirmKooX, Hauptmenue.Feldbreite * Y + Objektverwalter.Spielfeld.BildschirmKooY - 1)
                        End If

                        Grafikengine.Sprite.Draw2D(TexturenHalter.GetLaserStrahl, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                    End If
                Next
                'Nach oben markieren
                sngRotation = Math.PI / 2
                For I3 As Integer = 1 To Laser.Reichweite + 1
                    Dim X As Integer = Laser.Rechteck.X
                    Dim Y As Integer = Laser.Rechteck.Y - I3
                    If Objektverwalter.Spielfeld.OnMap(X, Y) Then
                        If I3 = 1 Then
                            Grafikengine.szfScale = New Size(Hauptmenue.Feldbreite / 2, Hauptmenue.Feldbreite * 2)
                            Grafikengine.ptfPosition = New Drawing.Point(Hauptmenue.Feldbreite * X + Objektverwalter.Spielfeld.BildschirmKooX - 1, Hauptmenue.Feldbreite * Y + Objektverwalter.Spielfeld.BildschirmKooY - Hauptmenue.Feldbreite / 2)
                        Else
                            Grafikengine.szfScale = Nothing
                            Grafikengine.ptfPosition = New Drawing.Point(Hauptmenue.Feldbreite * X + Objektverwalter.Spielfeld.BildschirmKooX - 1, Hauptmenue.Feldbreite * Y + Objektverwalter.Spielfeld.BildschirmKooY)
                        End If

                        Grafikengine.Sprite.Draw2D(TexturenHalter.GetLaserStrahl, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                    End If
                Next
                'Nach unten markiern
                For I4 As Integer = 1 To Laser.Reichweite + 1
                    Dim X As Integer = Laser.Rechteck.X
                    Dim Y As Integer = Laser.Rechteck.Y + I4
                    If Objektverwalter.Spielfeld.OnMap(X, Y) Then
                        Grafikengine.szfScale = Nothing
                        Grafikengine.ptfPosition = New Drawing.Point(Hauptmenue.Feldbreite * X + Objektverwalter.Spielfeld.BildschirmKooX - 1, Hauptmenue.Feldbreite * Y + Objektverwalter.Spielfeld.BildschirmKooY)
                        Grafikengine.Sprite.Draw2D(TexturenHalter.GetLaserStrahl, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                    End If
                Next

            End If
        End If
        If Frame = FrameMax - 2 Then
            If Zaehler > 8 Then
                Frame = FrameMax - 1
                Zaehler = 0
            Else
                Zaehler += 1
            End If
        Else
            If HalteFrame <= Zaehler Then
                Frame += 1
                Zaehler = 0
            Else
                Zaehler += 1
            End If
        End If
        If Frame > FrameMax Then
            Return False
        Else
            Return True
        End If
    End Function
End Class
